package com.suntianci.stock.utils;

import com.suntianci.stock.constant.PermissionConstant;
import com.suntianci.stock.pojo.domain.PermissionDomain;
import com.suntianci.stock.pojo.domain.PermissionInfo4AddPermissionDomain;
import com.suntianci.stock.pojo.entity.SysPermission;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName PermissionUtil
 * @Author 孙天赐
 * @Date 2025/1/12 9:53
 * @Description TODO: 用户权限相关工具类
 */
public class PermissionUtil {


    /**
     * 以sysPermission为根节点，利用权限集合permissionList递归构建权限树。只要菜单和目录
     *
     * @param permissionList
     * @param sysPermission
     * @return
     */
    public static PermissionDomain getPermissionTreeWithDirectiryAndMenu(SysPermission sysPermission, List<SysPermission> permissionList) {
        // 初始化对象
        PermissionDomain result = PermissionDomain.builder()
                .id(sysPermission.getId())
                .title(sysPermission.getTitle())
                .icon(sysPermission.getIcon())
                .path(sysPermission.getUrl())
                .name(sysPermission.getName()).build();
        List<PermissionDomain> children = new ArrayList<>();
        for (SysPermission permission : permissionList) {
            // 如果当前权限的父权限为sysPermission，且当前权限类型为目录或菜单 要使用equals，使用==是比较的地址
            if (permission.getPid().equals(sysPermission.getId()) && (permission.getType() == PermissionConstant.TYPE_DIRECTORY || permission.getType() == PermissionConstant.TYPE_MENU)) {
                // 递归构建当前权限的权限树
                PermissionDomain temp = getPermissionTreeWithDirectiryAndMenu(permission, permissionList);
                // 将该权限树添加先添加到List中
                children.add(temp);
            }
        }
        // 最后，将该权限树添加到父级权限的children中
        result.setChildren(children);
        return result;
    }

    /**
     * 利用权限集合permissionList递归构建权限树。全部权限都要
     *
     * @param sysPermission
     * @param permissionList
     * @return
     */
    public static PermissionDomain getAllPermissionTree(SysPermission sysPermission, List<SysPermission> permissionList) {
        // 初始化对象
        PermissionDomain result = PermissionDomain.builder()
                .id(sysPermission.getId())
                .title(sysPermission.getTitle())
                .icon(sysPermission.getIcon())
                .path(sysPermission.getUrl())
                .name(sysPermission.getName()).build();
        List<PermissionDomain> children = new ArrayList<>();
        for (SysPermission permission : permissionList) {
            // 如果当前权限的父权限为sysPermission，且当前权限类型为目录或菜单 要使用equals，使用==是比较的地址
            if (permission.getPid().equals(sysPermission.getId())) {
                // 递归构建当前权限的权限树
                PermissionDomain temp = getAllPermissionTree(permission, permissionList);
                // 将该权限树添加先添加到List中
                children.add(temp);
            }
        }
        // 最后，将该权限树添加到父级权限的children中
        result.setChildren(children);
        return result;
    }

    /**
     * 获取指定权限及其所有子权限的信息，只添加目录和菜单
     * @param result    存放结果的集合
     * @param permission    当前权限
     * @param allPermission 全部权限集合
     * @param level         当前权限等级
     * @return
     */
    public static void getPermissionInfoAndLevelWithDirectiryAndMenu(List<PermissionInfo4AddPermissionDomain> result, SysPermission permission, List<SysPermission> allPermission, int level) {
        // 先把当前权限添加进去
        PermissionInfo4AddPermissionDomain temp = PermissionInfo4AddPermissionDomain.builder()
                .id(String.valueOf(permission.getId()))
                .title(permission.getTitle())
                .level(level).build();
        result.add(temp);
        // 遍历所有权限
        for (SysPermission sysPermission : allPermission) {
            // 如果找到当前权限的子权限（只考虑目录和菜单），并且为则递归添加到集合中
            if(sysPermission.getPid().equals(permission.getId()) && (sysPermission.getType() == PermissionConstant.TYPE_DIRECTORY || sysPermission.getType() == PermissionConstant.TYPE_MENU)){
                // 递归调用，以当前子权限为目标，查找其下的目录和菜单
                getPermissionInfoAndLevelWithDirectiryAndMenu(result, sysPermission, allPermission, level + 1);
            }
        }
    }

    /**
     * 获取当前权限下的全部子权限（包括自身）
     * @param sysPermission 当前权限
     * @param allPermission 全部权限
     * @return
     */
    public static List<SysPermission> getPermissionAndAllSubPermission(SysPermission sysPermission, List<SysPermission> allPermission) {
        List<SysPermission> result = new ArrayList<>();
        getAllRelativePermission(sysPermission, allPermission, result);
        return result;
    }

    /**
     * 递归获取指定权限及其下的全部子权限
     * @param sysPermission
     * @param allPermission
     * @param result
     */
    private static void getAllRelativePermission(SysPermission sysPermission, List<SysPermission> allPermission, List<SysPermission> result) {
        // 先将当前权限添加到结果中
        result.add(sysPermission);
        for (SysPermission permission : allPermission) {
            // 找到子权限，递归获取子权限下的权限
            if(permission.getPid().equals(sysPermission.getId())){
                getAllRelativePermission(permission, allPermission, result);
            }
        }
    }

}
